package com.ecommerce.user.repository;

import com.ecommerce.user.entity.User;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

/**
 * 用户Repository
 */
@Repository
public interface UserRepository extends JpaRepository<User, Long> {

    /**
     * 根据用户名查找用户
     * @param username 用户名
     * @return 用户
     */
    Optional<User> findByUsername(String username);

    /**
     * 根据邮箱查找用户
     * @param email 邮箱
     * @return 用户
     */
    Optional<User> findByEmail(String email);

    /**
     * 检查用户名是否存在
     * @param username 用户名
     * @return 是否存在
     */
    Boolean existsByUsername(String username);

    /**
     * 检查邮箱是否存在
     * @param email 邮箱
     * @return 是否存在
     */
    Boolean existsByEmail(String email);

    /**
     * 检查邮箱是否被其他用户使用
     * @param email 邮箱
     * @param userId 当前用户ID
     * @return 是否存在
     */
    @Query("SELECT COUNT(u) > 0 FROM User u WHERE u.email = :email AND u.id != :userId")
    Boolean existsByEmailAndIdNot(@Param("email") String email, @Param("userId") Long userId);

    /**
     * 根据用户名模糊查询
     * @param username 用户名
     * @return 用户列表
     */
    @Query("SELECT u FROM User u WHERE u.username LIKE %:username% ORDER BY u.id DESC")
    List<User> findByUsernameContaining(@Param("username") String username);

    /**
     * 根据邮箱模糊查询
     * @param email 邮箱
     * @return 用户列表
     */
    @Query("SELECT u FROM User u WHERE u.email LIKE %:email% ORDER BY u.id DESC")
    List<User> findByEmailContaining(@Param("email") String email);

    /**
     * 根据状态查询用户
     * @param enabled 状态
     * @return 用户列表
     */
    @Query("SELECT u FROM User u WHERE u.enabled = :enabled ORDER BY u.id DESC")
    List<User> findByEnabled(@Param("enabled") Boolean enabled);

    /**
     * 根据状态查询用户（分页）
     * @param enabled 状态
     * @param pageable 分页
     * @return 用户分页
     */
    @Query("SELECT u FROM User u WHERE u.enabled = :enabled ORDER BY u.id DESC")
    Page<User> findByEnabled(@Param("enabled") Boolean enabled, Pageable pageable);

    /**
     * 统计总用户数
     * @return 用户数
     */
    @Query("SELECT COUNT(u) FROM User u")
    Long countUsers();

    /**
     * 统计今日新增用户数
     * @return 今日新增用户数
     */
    @Query("SELECT COUNT(u) FROM User u WHERE DATE(u.createdAt) = CURRENT_DATE")
    Long countTodayNewUsers();

    /**
     * 统计本周新增用户数
     * @return 本周新增用户数
     */
    @Query("SELECT COUNT(u) FROM User u WHERE YEARWEEK(u.createdAt) = YEARWEEK(CURRENT_DATE)")
    Long countThisWeekNewUsers();

    /**
     * 统计本月新增用户数
     * @return 本月新增用户数
     */
    @Query("SELECT COUNT(u) FROM User u WHERE YEAR(u.createdAt) = YEAR(CURRENT_DATE) AND MONTH(u.createdAt) = MONTH(CURRENT_DATE)")
    Long countThisMonthNewUsers();



    /**
     * 统计启用/禁用用户数
     * @param enabled 状态
     * @return 用户数
     */
    @Query("SELECT COUNT(u) FROM User u WHERE u.enabled = :enabled")
    Long countByEnabled(@Param("enabled") Boolean enabled);

    /**
     * 统计用户类型数
     * @param userType 用户类型
     * @return 用户数
     */
    @Query("SELECT COUNT(u) FROM User u WHERE u.userType = :userType")
    Long countByUserType(@Param("userType") String userType);

    /**
     * 统计指定时间后的用户数
     * @param dateTime 时间
     * @return 用户数
     */
    @Query("SELECT COUNT(u) FROM User u WHERE u.createdAt >= :dateTime")
    Long countByCreatedAtAfter(@Param("dateTime") LocalDateTime dateTime);

    /**
     * 根据用户名、邮箱或手机号模糊查询
     * @param username 用户名
     * @param email 邮箱
     * @param phone 手机号
     * @param pageable 分页
     * @return 用户分页
     */
    @Query("SELECT u FROM User u WHERE u.username LIKE %:username% OR u.email LIKE %:email% OR u.phone LIKE %:phone% ORDER BY u.id DESC")
    Page<User> findByUsernameContainingOrEmailContainingOrPhoneContaining(
            @Param("username") String username, 
            @Param("email") String email, 
            @Param("phone") String phone, 
            Pageable pageable);

    /**
     * 根据用户类型查询
     * @param userType 用户类型
     * @param pageable 分页
     * @return 用户分页
     */
    @Query("SELECT u FROM User u WHERE u.userType = :userType ORDER BY u.id DESC")
    Page<User> findByUserType(@Param("userType") String userType, Pageable pageable);
}